// 用来放axios对象，设置基地址、请求拦截、响应拦截等
import axios from 'axios'
import store from '@/store'
import router from '@/router'
import { Toast } from 'vant'

// 设置基地址
const request = axios.create({
  baseURL: 'http://geek.itheima.net/',
  timeout: 5000
})

// 请求拦截
request.interceptors.request.use(config => {
  // config就是本次请求相关信息-请求报文
  // 在发出请求之前加请求头
  if (store.state.user.tokenObj.token) {
    config.headers.Authorization = `Bearer ${store.state.user.tokenObj.token}`
  }
  return config
}, err => {
  return Promise.reject(err)
})

// 响应拦截
request.interceptors.response.use(response => {
  // 数据剥离
  return response.data
}, async err => {
  // 判断是不是401错误
  if (err.response.status === 401) {
    // 如果是代表token过期了，在这里做补救
    // 要利用refresh_token去得到新token -- 注意：用axios发请求
    try {
      const res = await axios({
        url: 'http://geek.itheima.net/v1_0/authorizations',
        method: 'put',
        headers: {
          Authorization: `Bearer ${store.state.user.tokenObj.refresh_token}`
        }
      })
      // 拿到新token先存起来 -- 既要存新token也要把之前的refresh_token给保留
      store.commit('user/setToken', {
        token: res.data.data.token,
        refresh_token: store.state.user.tokenObj.refresh_token
      })
      // 把之前的请求用最新的token再发一次
      return request(err.config)
    } catch {
      // 证明连refresh_token都过期了，那就打回登录页重新登录
      // 最好把vuex里的token都清空
      store.commit('user/setToken', {})
      Toast('登录状态失效，请重新登录！')
      router.push('/login')
      // 返回空对象可以解决报错
      return {}
    }
  } else {
    // 别的错误正常抛出
    return Promise.reject(err)
  }
})

// 暴露出去
export default request
